#include<iostream>
#include<set>
using namespace std;

//int main()
//{
//	set<int> s;//构造空的set
//
//	//排序+去重
//	s.insert(5);
//	s.insert(4);
//	s.insert(3);
//	s.insert(7);
//	s.insert(6);
//	s.insert(6);
//	s.insert(6);
//	s.insert(6);
//	s.insert(6);
//	s.insert(2);
//
//	set<int>::iterator it = s.begin();
//	while (it != s.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//
//	set<int> s1(s.begin(), s.end());//用[first，last)区间中的元素构造set
//	for (auto e : s1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	set<int> s2(s1);//set的拷贝构造
//	for (auto e : s2)
//	{
//		cout << e << " ";
//	}
//	cout << endl;

//
//	s.erase(s.begin());
//	int x;
//	cin >> x;
//	/*int num = s.erase(x);
//	if (num == 0)
//	{
//		cout << "不存在" << endl;
//	}*/
//
//	auto pos = s.find(x);
//	if (pos != s.end())
//	{
//		s.erase(pos);
//	}
//	else
//	{
//		cout << x << " 不存在" << endl;
//	}
//	
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	auto pos1 = find(s.begin(), s.end(), x);// O(N)
//	auto pos2 = s.find(x); //  O(logN)
//
//	cin >> x;
//	if (s.count(x))
//	{
//		cout << x << "在！" << endl;
//	}
//	else
//	{
//		cout << x << "不存在！" << endl;
//	}
//
//
//	return 0;
//}

//int main()
//{
//    std::set<int> myset;
//    std::set<int>::iterator itlow, itup;
//
//    for (int i = 1; i < 10; i++) myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90
//
//    // [30, 60]
//    // >= 30
//    itlow = myset.lower_bound(30);                //
//    // > 60
//    itup = myset.upper_bound(60);                 //               
//    myset.erase(itlow, itup);                     // 10 20 70 80 90
//
//    std::cout << "myset contains:";
//    for (std::set<int>::iterator it = myset.begin(); it != myset.end(); ++it)
//        std::cout << ' ' << *it;
//    std::cout << '\n';
//
//    return 0;
//}

//int main()
//{
//	int array[] = { 75,23,65,42,13 };
//	set<int> myset(array, array + 5);
//	
//	// begin() 、 end()
//	set<int>::iterator it = myset.begin();
//	while (it != myset.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//
//	//rbegin() 、 rend()
//	set<int>::reverse_iterator rit = myset.rbegin();
//	while (rit != myset.rend())
//	{
//		cout << *rit << " ";
//		++rit;
//	}
//	cout << endl;
//
//	//cbegin() 、 cend()
//	set<int>::const_iterator cit = myset.cbegin();
//	while (cit != myset.cend())
//	{
//		cout << *cit << " ";
//		++cit;
//	}
//	cout << endl;
//
//	//crbegin() 、crend()
//	set<int>::const_reverse_iterator crit = myset.crbegin();
//	while (crit != myset.crend())
//	{
//		cout << *crit << " ";
//		++crit;
//	}
//	cout << endl;
//
//	return 0;
//}

//int main()
//{
//	set<int> s;
//
//	cout << s.size() << endl;
//
//	if (s.max_size() > 10)//用于检查集合是否允许插入10个元素
//	{
//		for (int i = 0; i < 10; i++)
//		{
//			s.insert(i);
//		}
//	}
//
//	while (!s.empty())
//	{
//		cout << *s.begin() << " ";
//		s.erase(s.begin());
//	}
//	cout << endl;
//
//	return 0;
//}

//int main()
//{
//	int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4,6, 8, 0 };
//	set<int> s(array, array + sizeof(array) / sizeof(array[0]));
//	cout << s.size() << endl;
//
//	//正向打印set中的元素，可以看出set可去重
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	//使用迭代器逆向打印set中的元素
//	for (auto it = s.rbegin(); it != s.rend(); ++it)
//	{
//		cout << *it << " ";
//	}
//	cout << endl;
//
//	//set中值为3的元素出现了几次
//	cout << s.count(3) << endl;
//
//	return 0;
//}

////////////////////////////////////////////////////////////////////////////////////////
#include<map>
#include<string>

//int main()
//{
//	//map<string, string> m;//无参构造
//	//pair<string, string> kv1("left", "左边");//有名对象的带参构造
//	//m.insert(kv1);
//
//	//m.insert(pair<string, string>("right", "右边"));//匿名对象初始化
//
//	//m.insert(make_pair("insert", "插入"));
//
//	//pair<string, string> kv2 = { "string","字符串" };
//	//m.insert({ "string","字符串" });//单参数的隐式类型转换
//
//	//多参数的隐式类型转换
//	map<string, string> m = { {"left", "左边"}, {"right", "右边"},{"insert", "插入"},{ "string", "字符串" } };
//
//	map<string, string>::iterator it = m.begin();
//	while (it != m.end())
//	{
//		//cout << *it << " ";//make_pair不支持流插入和流提取
//		//cout << (*it).first << ":" << (*it).second << endl;
//		cout << it->first << ":" << it->second << endl;
//		++it;
//	}
//	cout << endl;
//
//	for (auto& e : m)
//	{
//		cout << e.first << ":" << e.second << endl;
//	}
//	cout << endl;
//
//	for (auto& [x, y] : m)//C++17可用
//	{
//		cout << x << ":" << y << endl;
//	}
//	cout << endl;
//
//	return 0;
//}

//int main()
//{
//	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
//	map<string, int> countTree;
//	for (const auto& str : arr)
//	{
//		countTree[str]++;
//	}
//
//	for (const auto& e : countTree)
//	{
//		cout << e.first << ":" << e.second << endl;
//	}
//	cout << endl;
//
//	//int i = int();
//	//int j = int(10);
//
//	return 0;
//}
//
//int main()
//{
//	map<string, string> m;
//
//	//向map中插入元素的方式
//	//将键值对<"pach","桃子">插入map中，用pair直接来构造键值对
//	m.insert(pair<string, string>("peach", "桃子"));
//
//	//将键值对<"sort", "排序">插入map中，用make_pair函数来构造键值对
//	m.insert(make_pair("sort", "排序"));
//
//	//借用operator[]向map中插入元素
//	//插入+修改
//	m["left"] = "左边";
//
//	//修改
//	m["left"] = "左边、剩余";
//
//	//key不存在->插入<"insert","">
//	m["insert"];
//
//	//key存在->查找
//	cout << m["left"] << endl;
//
//	return 0;
//}

int main()
{
	int array[] = { 2, 1, 3, 9, 6, 0, 5, 8, 4, 7 };

	// 注意：multiset在底层实际存储的是<int, int>的键值对
	multiset<int> s(array, array + sizeof(array) / sizeof(array[0]));
	for (auto& e : s)
		cout << e << " ";
	cout << endl;
	return 0;
}